package cn.itcast.spring.demo4;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect   //使用@Aspect注解来表示我们这个类就是我们的切面类
public class UserServiceProxy {
	
	/**
	 * 定义我们的前置通知
	 */
	@Before(value="execution(* *.add*(..))")
	public void addMethodStrong(JoinPoint joinPoint){
		System.out.println(joinPoint.getSignature().getDeclaringType());
		System.out.println(joinPoint.getSignature().getDeclaringTypeName());
		System.out.println("添加之前进行权限的校验");
	}
	
	/**
	 * 定义我们的后置通知
	 */
	@AfterReturning(value="execution(* *.delete*(..))",returning="obj")
	public void afterMethodStrong(JoinPoint joinPoint,Object obj){
		System.out.println("我是后置通知，我会在目标方法执行之后才会执行");
		System.out.println(obj);
	}
	
	
	
	/**
	 * 环绕通知
	 * @throws Throwable 
	 */
	@Around(value="execution(* *.update*(..))")
	public  void aroundMethodStrong(ProceedingJoinPoint joinPoint) throws Throwable{
		System.out.println("环绕通知，在我们程序执行之前执行的逻辑");
		//通过执行proceed方法才会执行我们目标类中的方法
		joinPoint.proceed();
		System.out.println("环绕通知，在我们程序执行之后执行的逻辑");
	}
	
	
	/**
	 * 异常通知
	 */
	@AfterThrowing(value="execution(* *.find*(..))",throwing="throwable")
	public void exceptMethodStrong(Throwable throwable){
		System.out.println("我是异常通知，只有在程序抛出异常的时候，我才会执行");
		System.out.println(throwable.getMessage());
	}
	/**
	 * 最终通知
	 */
	@After(value="execution(* *.batch(..))")
	public void finalMethodStrong(JoinPoint joinPoint){
		System.out.println(joinPoint.getSignature().getDeclaringTypeName());
		System.out.println(joinPoint.getSignature().getDeclaringType());
		System.out.println("我是最终通知，就算程序抛出异常，我也会执行");
	}
	
	
	
	
	
	

}
